﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace StockShark.BusinessModels
{
    public class InstrumentsTrigger
    {
        public Thread Thread;
        public InstrumentsUpdater Updater;
        public InstrumentsSynchroznier Synchronizer;
        
        public InstrumentsTrigger() 
        {
            Updater = new InstrumentsUpdater();
            Updater.Parser.UriList.Add("http://gielda.onet.pl/indeksy-i-akcje,18633,100,0,notowania-gpw-start");
            Updater.Parser.UriList.Add("http://gielda.onet.pl/indeksy-i-akcje,18635,300,0,notowania-newconnect-start");
            Updater.Parser.UriList.Add("http://waluty.onet.pl/notowania-walut-on-line-forex,18906,notowania-online");
            Updater.Parser.UriList.Add("http://gielda.onet.pl/surowce,41922,430,0,notowania-surowce");
            Updater.Parser.UriList.Add("http://gielda.onet.pl/towary,47938,440,0,notowania-towary");
            Updater.Parser.UriList.Add("http://gielda.onet.pl/akcje,18633,201,0,notowania-gpw-jednolite");

            Synchronizer = new InstrumentsSynchroznier();
        }

        /// <summary>
        /// Uruchomienie wątku związanego z triggerowaniem
        /// </summary>
        public void Start()
        {
            ThreadStart wstart = new ThreadStart(Actualize);
            Thread = new Thread(wstart);
            Thread.Start();
        }

        /// <summary>
        /// Zatrzymanie wątku związanego z triggerowaniem
        /// </summary>
        public void Stop() 
        {
            Thread.Abort();
        }

        /// <summary>
        /// Delegat odpowiedzialny za logikę biznesową triggera
        /// Pomiędzy 8.50 a 17.50 aktualizacje i usypianie wątku na 15min
        /// O 23.30 synchronizacja historii i 8h uśpienie wątku aż do godz 8
        /// </summary>
        public void Actualize() 
        {
            while (true) 
            {
                do{
                    Updater.Update();
                    // uśpienie wątku na 15 min
                    Thread.Sleep(900000);

                }while((DateTime.Now.Hour == 8 && DateTime.Now.Minute >= 50) || 
                        (DateTime.Now.Hour > 8 && DateTime.Now.Hour < 17 ) ||
                        (DateTime.Now.Hour == 17 && DateTime.Now.Minute <= 50));
                
                if (DateTime.Now.Hour == 23 && (DateTime.Now.Minute == 30 || DateTime.Now.Minute == 50 ||
                    (DateTime.Now.Minute > 30 || DateTime.Now.Minute < 50))) 
                {
                    Synchronizer.Synchronize();
                    // uśpienie wątku na 8h
                    Thread.Sleep(28800000);
                }
                // uśpienie wątku na minutę
                Thread.Sleep(60000);
            }
        }
    }
}
